"""通过键盘输入方程式 y=ax^2+bx+c 中的系数 a,b,c后先解方程，如果有实数
根x1和x2，则绘制 x 在 [1.1*x1,1.1*x2 ，(x1<=x2)] 范围内的函数波形图。
图表需包含标题，说明当前函数表达式，中文显示正常，x,y轴有刻度，函数波形
和x,y轴颜色有区别。
"""
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"]="SimHei"
plt.rcParams["axes.unicode_minus"]=False

# 输入系数
a = float(input("请输入二次项系数a: "))
b = float(input("请输入一次项系数b: "))
c = float(input("请输入常数项c: "))

# 解方程
def func(a, b, c):

    delta = b**2 - 4*a*c
    if delta < 0:
        print("方程无实数根")
        return None, None
    elif delta == 0:
        x = -b / (2*a)
        print(f"方程有一个实数根: x = {x:.2f}")
        return x, x
    else:
        x1 = (-b - np.sqrt(delta)) / (2*a)
        x2 = (-b + np.sqrt(delta)) / (2*a)
        print(f"方程有两个实数根: x1 = {x1:.2f}, x2 = {x2:.2f}")
      
        return min(x1, x2), max(x1, x2)

# 解方程并获取根
x1, x2 = func(a, b, c)

# 如果有实数根则绘制图形
if x1 is not None and x2 is not None:
    # 计算绘图范围
    x_min = 1.1 * min(x1, x2)
    x_max = 1.1 * max(x1, x2)
    
    # 生成x值
    x = np.linspace(x_min, x_max, 400)
    y = a * x**2 + b * x + c
    
    # 绘制图形
    plt.figure(figsize=(8, 6))
    plt.plot(x, y, label=f'y = {a}x² + {b}x + {c}')
    plt.tick_params(axis='y', labelcolor='blue')
    
    # 添加图例和标题
    plt.title('二次函数图像')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.grid(True)
    plt.show()


